package com.wanghai.carwashing.core.dao;

import com.google.common.base.Preconditions;
import com.wanghai.carwashing.core.model.vo.BaseParamVo;
import com.wanghai.carwashing.core.model.vo.Pager;
import java.io.Serializable;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

/**
 * BaseDao,提供基本的增删改查方法
 * @author 王海
 */
@Transactional
public class BaseDao<T>{
    @Autowired
    private SqlSessionTemplate sqlSessionTemplate;
    /**
     * 添加一条记录
     * @param obj 
     */
    public int add(T obj){
        return sqlSessionTemplate.insert(obj.getClass().getName()+".add",obj);
    }
    /**
     * 更改记录
     * @param obj 
     */
    public int update(T obj){
        return   sqlSessionTemplate.update(obj.getClass().getName()+".update",obj);
    }
    /**
     * 删除记录
     * @param obj
     * @return 
     */
    public int delete(T obj){
        return sqlSessionTemplate.delete(obj.getClass().getName()+".del", obj);
    }
    /**
     * 删除记录
     * @param sqlId
     * @param obj
     * @return 
     */
    public int del(String sqlId,Object obj){
         return sqlSessionTemplate.delete(sqlId, obj);
    }
    /**
     * 删除记录
     * @param clz
     * @param obj
     * @return 
     */
    public int del(Class<T> clz,Object obj){
         return sqlSessionTemplate.delete(clz.getName()+".del", obj);
    }
    
    /**
     * 根据ID加载对象
     * @param clz
     * @param id
     * @return 
     */
    public T load(Class<T> clz,Serializable id){
       Object obj = sqlSessionTemplate.selectOne(clz.getName()+".load",id);
       return (T) obj;
    }
    /**
     * 根据SQLID查找单个对象
     * @param sqlId
     * @param obj
     * @return 
     */
    public T loadBySqlId(String sqlId,Object obj){
        Object result = sqlSessionTemplate.selectOne(sqlId,obj);
        return  (T) result;
    }
    /**
     * 不分页获取数据
     * @param clz
     * @param obj
     * @return 
     */
    public List<T> list(Class<T> clz,Object obj){
        return sqlSessionTemplate.selectList(clz.getClass().getName()+".list", obj);
    }
    /**
     * 不分页获取数据
     * @param sqlId
     * @param obj
     * @return 
     */
    public List<T> list(String sqlId,Object obj){
        return sqlSessionTemplate.selectList(sqlId, obj);
    }
  
    /**
     * 分页获取数据
     * @param sqlId
     * @param paramVo
     * @return 
     */
    public Pager<T> find(String sqlId,BaseParamVo paramVo) {
        // 前置条件检查
        Preconditions.checkNotNull(sqlId, "sqlId不能为空");
        Preconditions.checkNotNull(paramVo, "paramVo不能为空");
        int pageSize = paramVo.getPageSize();
        int pageOffset = (paramVo.getPage()-1)*paramVo.getPageSize();
        Pager<T> pager = new Pager<T>();
        List<T> datas = sqlSessionTemplate.selectList(sqlId, paramVo);
        pager.setDatas(datas);
        pager.setPageOffset(pageOffset);
        pager.setPageIndex(paramVo.getPage());
        int totalRecord = sqlSessionTemplate.selectOne(sqlId+"_count", paramVo);
        pager.setTotalRecord(totalRecord);
        pager.setTotalPage(totalRecord%pageSize==0?totalRecord/pageSize:totalRecord/pageSize+1);
        pager.setTotalRecord(pageSize);
        return pager;
    }
   /**
    * 分页获取数据
    * @param clz
    * @param paramVo
    * @return 
    */
    public Pager<T> find(Class<T> clz,BaseParamVo paramVo){
        return find(clz.getName()+".find", paramVo);
    }
    /**
     * 查找某个对象是否存在
     * @param clz
     * @param paramVo
     * @return 
     */
    public boolean findObjectIsExist(Class<T>clz,BaseParamVo paramVo){
        Pager<T> pager = find(clz, paramVo);
        int totalRecord = pager.getTotalRecord();
        return totalRecord>0;
    }
    /**
     * 查找记录的条数
     * @param clz
     * @param paramVo
     * @return 
     */
    public long findObjectCount(Class<T> clz,BaseParamVo paramVo){
        Long count = sqlSessionTemplate.selectOne(clz.getName()+".find_count", paramVo);
        return count.longValue();
    }
}
